home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / gemfsc19 / gemfsc19.lzh / GEMFUNCS / RCINTERS.C < prev    next >
C/C++ Source or Header  |  1993-05-08  |  5KB  |  126 lines

  1. /**************************************************************************
  2.  * RCINTERS.C - Calc intersection of two GRECT rectangles.
  3.  *              Returns TRUE if rectanlges have common area, FALSE if not.
  4.  *************************************************************************/
  5.  
  6. #if defined(__HSC__) || defined(__GNUC__)
  7.  
  8. #include "gemfintl.h"
  9.  
  10. short rc_intersect(prect1, prect2)
  11.     register GRECT *prect1;
  12.     register GRECT *prect2;
  13. {
  14.     register short    w1, w2;
  15.     short             lx, rx;
  16.     short             ty, by;
  17.  
  18.     /* calc right-side x as the lesser x of the two rectangles */
  19.  
  20.     w1 = prect1->g_x + prect1->g_w;
  21.     w2 = prect2->g_x + prect2->g_w;
  22.     rx  = (w1 < w2) ? w1 : w2;
  23.  
  24.     /*  calc bottom y as the lesser y of the two rectanlges */
  25.  
  26.     w1 = prect1->g_y + prect1->g_h;
  27.     w2 = prect2->g_y + prect2->g_h;
  28.     by  = (w1 < w2) ? w1 : w2;
  29.  
  30.     /* calc left-side x as the greater x of the two rectangles */
  31.  
  32.     w1 = prect1->g_x;
  33.     w2 = prect2->g_x;
  34.     lx = (w1 > w2) ? w1 : w2;
  35.  
  36.     /* calc top y as the greater y of the two rectangles */
  37.  
  38.     w1 = prect1->g_y;
  39.     w2 = prect2->g_y;
  40.     ty = (w1 > w2) ? w1 : w2;
  41.  
  42.     /* store the calculated rectangle (converting back to GRECT-type w/h) */
  43.  
  44.     prect2->g_x = lx;
  45.     prect2->g_y = ty;
  46.     prect2->g_w = rx - lx;
  47.     prect2->g_h = by - ty;
  48.  
  49.     /*
  50.      * if the calculated width or height is zero or less, it indicates
  51.      * that there is no overlap in at least one dimension, and thus no
  52.      * overlap in the rectangles, so return FALSE.  if both values are
  53.      * positive, there is a common intersecting area, so return TRUE.
  54.      */
  55.  
  56.     if ( prect2->g_w <= 0 || prect2->g_h <= 0) {
  57.         return 0;
  58.     } else {
  59.         return 1;
  60.    }
  61. }
  62.  
  63. /*
  64. #pragma asm
  65.  
  66. ;*************************************************************************
  67. ;* RCINTERS.S - Calc intersection of two GRECT rectangles.
  68. ;*************************************************************************
  69.  
  70.           .globl     _rc_intersect
  71. _rc_intersect:
  72.  
  73.           move.l    4(sp),a1 
  74.           move.l    8(sp),a0 
  75.           movem.l   d3-d4,-(sp)
  76.                                         ; Calc right-side x...
  77.           move.w    (a1),d0             ;  rx1 = x1 + w1 
  78.           add.w     4(a1),d0            
  79.           move.w    (a0),d1             ;  rx2 = x2 + w2
  80.           add.w     4(a0),d1            
  81.           cmp.w     d0,d1               ;  compare rx1 <-> rx2
  82.           blt.s     .gotrx              ;  proper rx is the smaller
  83.           move.w    d0,d1               ;  of the two.
  84. .gotrx:   
  85.                                         ; Calc bottom y...
  86.           move.w    2(a1),d0            ;  by1 = y1 + h1
  87.           add.w     6(a1),d0            
  88.           move.w    2(a0),d2            ;  by2 = y2 + h2
  89.           add.w     6(a0),d2            
  90.           cmp.w     d0,d2               ;  compare by1 <-> by2
  91.           blt.s     .gotby              ;  proper by is the smaller
  92.           move.w    d0,d2               ;  of the two.       
  93. .gotby:                                 
  94.                                         ; Calc left-side x...
  95.           move.w    (a0),d3             ;  assume x2
  96.           cmp.w     (a1),d3             ;  compare x1 <-> x2  
  97.           bge.s     .gotlx              ;  proper lx is larger
  98.           move.w    (a1),d3             ;  of the two.
  99. .gotlx:                                 
  100.                                         ; Calc top y...
  101.           move.w    2(a0),d4            ;  assume y2
  102.           cmp.w     2(a1),d4            ;  compare y1 <-> y2 
  103.           bge.s     .gotty              ;  proper ty is larger
  104.           move.w    2(a1),d4            ;  of the two.
  105. .gotty:
  106.                                         ; Got all the x/y's...
  107.           moveq.l   #0,d0               ; Assume intersection is false.             
  108.           move.w    d3,(a0)+            ; store left x
  109.           move.w    d4,(a0)+            ; store top y
  110.           sub.w     d3,d1               ; compute width
  111.           ble.s     .done               ; if negative or zero, no intersect
  112.           move.w    d1,(a0)+            ; else store it
  113.           sub.w     d4,d2               ; compute height
  114.           ble.s     .done               ; if negative or zero, no intersect
  115.           move.w    d2,(a0)+            ; else store it
  116.           moveq.l   #1,d0               ; intersection is true 
  117. .done:
  118.           movem.l   (sp)+,d3-d4
  119.           tst.w     d0                  ; insure CCR return matches d0.
  120.           rts
  121.           
  122. #pragma endasm
  123. */
  124.  
  125. #endif
  126.